package br.com.afi.web.util.tag;

import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import br.com.afi.util.log.Logger;

/**
 * Essa tag insere os scripts necessários para que o Google Analytics seja capaz de gerar relatórios
 * do site. Sempre insira essa tag logo após a tag &lt;/body&gt;. Essa tag pode ser configura
 * através de um arquivo google-analytics.properties com as chaves:<br>
 * google-analytics.accountId: Id da conta no Google Analytics<br>
 * google-analytics.roleId: Id (número) do perfil na conta do Google Analytics<br>
 * google-analytics.on: Indica se a tag esta ligada ou desligada.<br>
 * <br>
 * Os atributos informados na tag tem prioridade sobre os informados no arquivo .properties.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 */
public class ELGoogleAnalyticsTag extends TagSupport
{
	private static final long serialVersionUID = 1L;
	private static final Logger log = Logger.getLogger( ELGoogleAnalyticsTag.class );

	/**
	 * Id da conta no Google Analytics
	 */
	private String accountId;

	/**
	 * Id (número) do perfil na conta do Google Analytics
	 */
	private Integer roleId;

	/**
	 * Indica se a tag esta ligada ou desligada. Padrão true.
	 */
	private boolean on = true;

	private static ResourceBundle properties;
	static
	{
		try
		{
			properties = ResourceBundle.getBundle( "google-analytics" );
		}
		catch ( MissingResourceException ex )
		{
			log.info( "Arquivo google-analytics.properties não encontrado." );
		}
	}

	@Override
	public int doStartTag() throws JspException
	{
		if ( accountId == null )
		{
			try
			{
				if ( properties != null )
				{
					accountId = properties.getString( "google-analytics.accountId" );
				}
			}
			catch ( MissingResourceException e )
			{
				// Vazio proposital
			}
			if ( accountId == null )
			{
				final JspException ex = new JspException( "Account Id é obrigatório. Deve ser informada na tag ou no arquivo google-analytics.properties, chave: google-analytics.accountId" );
				log.error( ex.getMessage(), ex );
				throw ex;
			}
		}
		if ( roleId == null )
		{
			try
			{
				if ( properties != null )
				{
					roleId = Integer.parseInt( properties.getString( "google-analytics.roleId" ) );
				}
			}
			catch ( MissingResourceException e )
			{
				// Vazio proposital
			}
			if ( roleId == null )
			{
				final JspException ex = new JspException( "Role Id é obrigatório. Deve ser informada na tag ou no arquivo google-analytics.properties, chave: google-analytics.roleId" );
				log.error( ex.getMessage(), ex );
				throw ex;
			}
		}
		try
		{
			if ( properties != null )
			{
				on = Boolean.parseBoolean( properties.getString( "google-analytics.on" ) );
			}
		}
		catch ( MissingResourceException ex )
		{
			log.info( "Chave google-analytics.on não encontrada." );
		}
		return super.doStartTag();
	}

	@Override
	public int doEndTag() throws JspException
	{
		if ( on )
		{
			final JspWriter out = this.pageContext.getOut();

			try
			{
				out.print( "<script type=\"text/javascript\">" );
				out.print( "var gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : \"http://www.\");" );
				out.print( "document.write(unescape(\"%3Cscript src='\" + gaJsHost + \"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));" );
				out.print( "</script>" );
				out.print( "<script type=\"text/javascript\">" );
				out.print( "try{ " );
				out.print( "var pageTracker = _gat._getTracker(\"" );
				out.print( accountId );
				out.print( "-" );
				out.print( roleId );
				out.print( "\");" );
				out.print( "pageTracker._trackPageview();" );
				out.print( "} catch(err) {}" );
				out.print( "</script>" );
			}
			catch ( Exception e )
			{
				final JspException ex = new JspException( "Não foi possivel construir a tag do Google Analytics.", e );
				log.error( ex.getMessage(), ex );
				throw ex;
			}
		}
		else
		{
			log.warn( "Google-Analytics desligado." );
		}

		return super.doEndTag();
	}

	public String getAccountId()
	{
		return accountId;
	}

	public void setAccountId( String accountId )
	{
		this.accountId = accountId;
	}

	public Integer getRoleId()
	{
		return roleId;
	}

	public void setRoleId( Integer roleId )
	{
		this.roleId = roleId;
	}

	public boolean isOn()
	{
		return on;
	}

	public void setOn( boolean on )
	{
		this.on = on;
	}
}
